package com.sky.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicLong;

public class OrderNumberUtil {

    // 生成策略枚举
    public enum Strategy {
        DATE_RANDOM,    // 日期+随机数
        TIMESTAMP_RANDOM, // 时间戳+随机数
        SEQUENTIAL,     // 顺序号
        CUSTOM_PREFIX    // 自定义前缀+日期+随机数
    }

    // 默认前缀
    private static final String DEFAULT_PREFIX = "SKY";

    // 顺序号生成器
    private static final AtomicLong SEQUENCE = new AtomicLong(1);

    // 随机数生成器
    private static final Random RANDOM = new Random();

    private  OrderNumberUtil() {
        // 私有构造方法，防止实例化
    }

    /**
     * 生成订单号（使用默认策略 DATE_RANDOM）
     * @return 订单号
     */
    public static String generate() {
        return generate(Strategy.DATE_RANDOM, DEFAULT_PREFIX);
    }

    /**
     * 生成订单号（指定策略）
     * @param strategy 生成策略
     * @return 订单号
     */
    public static String generate(Strategy strategy) {
        return generate(strategy, DEFAULT_PREFIX);
    }

    /**
     * 生成订单号（指定策略和前缀）
     * @param strategy 生成策略
     * @param prefix 自定义前缀
     * @return 订单号
     */
    public static String generate(Strategy strategy, String prefix) {
        switch (strategy) {
            case DATE_RANDOM:
                return generateDateRandom(prefix);
            case TIMESTAMP_RANDOM:
                return generateTimestampRandom(prefix);
            case SEQUENTIAL:
                return generateSequential(prefix);
            case CUSTOM_PREFIX:
                return generateCustomPrefix(prefix);
            default:
                return generateDateRandom(prefix);
        }
    }

    // 日期+随机数策略
    private static String generateDateRandom(String prefix) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String datePart = sdf.format(new Date());
        String randomPart = String.format("%04d", ThreadLocalRandom.current().nextInt(10000));
        return prefix + datePart + randomPart;
    }

    // 时间戳+随机数策略
    private static String generateTimestampRandom(String prefix) {
        long timestamp = System.currentTimeMillis();
        String randomPart = String.format("%03d", RANDOM.nextInt(1000));
        return prefix + timestamp + randomPart;
    }

    // 顺序号策略
    private static String generateSequential(String prefix) {
        long sequence = SEQUENCE.getAndIncrement();
        return prefix + String.format("%010d", sequence);
    }

    // 自定义前缀策略
    private static String generateCustomPrefix(String prefix) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
        String datePart = sdf.format(new Date());
        String randomPart = String.format("%05d", RANDOM.nextInt(100000));
        return prefix + datePart + randomPart;
    }
}
